package be.khleuven.KevinVranken.vgo;

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

@SuppressWarnings("serial")
public class interneFrames extends JFrame {

	EenActie eenActie = new DriesActie();

	DefaultListModel listData = new DefaultListModel();
	JList lijst;
	JButton toevoegenKnop;
	JButton verwijderenKnop;
	JTextField tekstveld;
	WindowListener listener = new WindowListener() {
		public void windowActivated(WindowEvent w) {
		}

		public void windowClosed(WindowEvent w) {
		}

		public void windowClosing(WindowEvent w) {
			int response = JOptionPane.showConfirmDialog(null,
					"Wenst u dit venster te sluiten?", "Bent u zeker ?",
					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
			if (response == JOptionPane.NO_OPTION) {
				// niets doen
			} else if (response == JOptionPane.YES_OPTION) {
				System.exit(0);
			} else if (response == JOptionPane.CLOSED_OPTION) {
				// niets doen
			}
		}

		public void windowDeactivated(WindowEvent e) {
			// TODO Auto-generated method stub

		}

		public void windowDeiconified(WindowEvent e) {
			// TODO Auto-generated method stub

		}

		public void windowIconified(WindowEvent e) {
			// TODO Auto-generated method stub

		}

		public void windowOpened(WindowEvent e) {
			// TODO Auto-generated method stub

		}
	};

	public interneFrames() {
		super("Voorbeeld met interne frames");

		try {
			UIManager.put("OptionPane.cancelButtonText", "Annuleren");
			UIManager.put("OptionPane.noButtonText", "Neen");
			UIManager.put("OptionPane.okButtonText", "Stop! Andy Time");
			UIManager.put("OptionPane.yesButtonText", "Ja");
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		} catch (Exception e) {
			try {
				UIManager
				.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
			} catch (Exception e1) {
			
			}

		}

		JDesktopPane desktop = new JDesktopPane();
		setContentPane(desktop);
		Container desktopContainer = getContentPane();

		// interne frames aanmaken
		JInternalFrame internFrame1 = new JInternalFrame("Mudkips", true, true,
				true, true);
		JInternalFrame internFrame2 = new JInternalFrame(
				"Ik ben een ander venster", true, true, true, true);
		JInternalFrame internFrame3 = new JInternalFrame("Ik bevat een tabel",
				true, true, true, true);

		// containers maken
		Container internFrame1Container = internFrame1.getContentPane();
		Container internFrame2Container = internFrame2.getContentPane();
		Container internFrame3Container = internFrame3.getContentPane();

		// deze frames toevoegen
		desktop.add(internFrame1);
		desktopContainer.add(internFrame2);
		desktopContainer.add(internFrame3);

		// attributen interne frames
		internFrame1.setSize(250, 230);
		internFrame1.setLocation(0, 0);

		internFrame2.setSize(500, 550);
		internFrame2.setLocation(280, 0);

		internFrame3.setSize(700, 550);
		internFrame3.setLocation(80, 0);

		internFrame1.setVisible(true);
		internFrame2.setVisible(true);
		internFrame3.setVisible(true);

		// dingen toevoegen aan de subframes
		// subframe 1
		internFrame1Container.setLayout(new FlowLayout());

		ActionListener woutActie = new strategieActieZetten(new WoutActie());
		ActionListener driesActie = new strategieActieZetten(new DriesActie());

		JButton uitvoerenButton = new JButton("Voer uit");
		uitvoerenButton.addActionListener(new strategieActieUitvoeren());

		JLabel afbeelding = new JLabel();
		afbeelding.setPreferredSize(new Dimension(100, 100));
		internFrame1Container.add(afbeelding);

		JRadioButton radioAction1 = new JRadioButton("Wout implementeren");
		JRadioButton radioAction2 = new JRadioButton("Dries implementeren");

		radioAction1.addActionListener(woutActie);
		radioAction2.addActionListener(driesActie);
		internFrame1Container.add(radioAction1);
		internFrame1Container.add(radioAction2);
		internFrame1Container.add(uitvoerenButton);
		// Radioknoppen in een group steken er maar ��n enkele tegelijk kan
		// geslecteerd worden
		ButtonGroup bg = new ButtonGroup();
		bg.add(radioAction1);
		bg.add(radioAction2);

		// subframe 2
		internFrame2Container.setLayout(new GridBagLayout());
		lijst = new JList(listData);
		toevoegenKnop = new JButton("Toevoegen");
		toevoegenKnop.addActionListener(new lijstToevoegenActie());
		verwijderenKnop = new JButton("Verwijderen");
		verwijderenKnop.addActionListener(new lijstVerwijderenActie());

		listData.addElement("Wout");
		listData.addElement("Samjay");
		listData.addElement("Kevin");
		listData.addElement("Joske");
		listData.addElement("Mark");

		// de gridbaglayout

		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(5, 5, 5, 5);

		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 3;
		c.gridheight = 3;
		c.weightx = c.weighty = 1.0;
		internFrame2Container.add(lijst, c);

		tekstveld = new JTextField();
		tekstveld.setPreferredSize(new Dimension(200, JTextField.HEIGHT));
		c.gridx = 0;
		c.gridy = 4;
		c.gridwidth = 1;
		c.gridheight = 1;
		c.weightx = c.weighty = 0.0;
		internFrame2Container.add(tekstveld, c);

		c.gridx = 1;
		c.gridy = 4;
		c.gridwidth = 1;
		c.gridheight = 1;
		c.weightx = c.weighty = 0.0;
		internFrame2Container.add(toevoegenKnop, c);

		c.gridx = 4;
		c.gridy = 0;
		c.gridwidth = 1;
		c.gridheight = 1;
		c.weightx = c.weighty = 0.0;
		internFrame2Container.add(verwijderenKnop, c);

		// subframe 3
		String[] kolomHoofding = { "Voornaam", "Achternaam", "Stad", "Waal?" };

		Object[][] data = {
				{ "Kevin", "Vranken", "Aarschot", "Neen!" },
				{"Andy" ,"Debrouwer", "Tienen", "ja"}
		};
		
		JTable table = new JTable(data, kolomHoofding);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        internFrame3Container.add(scrollPane);
			

		internFrame3Container.setLayout(new GridLayout());

		// Hoofdpaneel attributen
		this.addWindowListener(listener);
		this.setLocation(100, 100);
		this.setSize(800, 600);
		this.setVisible(true);
		desktopContainer.setBackground(Color.WHITE);

		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	}

	public static void main(String args[]) {
		new interneFrames();
	}

	/**
	 * @return the eenActie
	 */
	public EenActie getEenActie() {
		return eenActie;
	}

	/**
	 * @param eenActie
	 *            the eenActie to set
	 */
	public void setEenActie(EenActie eenActie) {
		this.eenActie = eenActie;
	}

	class lijstVerwijderenActie implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			verwijderOnderdeel(lijst, listData, verwijderenKnop);
		}
	}

	class strategieActieUitvoeren implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			eenActie.doeIets(e, interneFrames.this);
		}
	}

	class strategieActieZetten implements ActionListener {
		private EenActie eenActie = null;

		public strategieActieZetten(EenActie eenActie) {
			this.eenActie = eenActie;
		}

		public void actionPerformed(ActionEvent e) {
			interneFrames.this.eenActie = eenActie;
		}
	}

	public void verwijderOnderdeel(JList lijst, DefaultListModel listData,
			JButton verwijderenKnop) {
		int index = lijst.getSelectedIndex();
		listData.remove(index);
		int size = listData.getSize();
		if (size == 0) {
			verwijderenKnop.setEnabled(false);
		} else {
			if (index == listData.getSize()) {
				index--;
			}
			lijst.setSelectedIndex(index);
			lijst.ensureIndexIsVisible(index);
		}
	}

	class lijstToevoegenActie implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			String name = tekstveld.getText();

			if (name.equals("") || listData.contains(name)) {
				Toolkit.getDefaultToolkit().beep();
				tekstveld.requestFocusInWindow();
				tekstveld.selectAll();
				return;
			}

			int index = lijst.getSelectedIndex(); // geef geselecteerde index
			if (index == -1) { // geen selectie, toevoegen aan het begin
				index = 0;
			} else { // toevoegen na het laast geselcteerde item
				index++;
			}

			listData.insertElementAt(tekstveld.getText(), index);

			tekstveld.requestFocusInWindow();
			tekstveld.setText("");

			verwijderenKnop.setEnabled(true); // toevoegen knop weer zichtwaar
			// maken
			lijst.setSelectedIndex(index);
			lijst.ensureIndexIsVisible(index);
		}

	}
}